// 题目描述
// 给你一个整数数组 arr，如果每个数的出现次数都是独一无二的，就返回 true；否则返回 false。

 

// 示例 1：

// 输入：arr = [1,2,2,1,1,3]
// 输出：true
// 解释：在该数组中，1 出现了 3 次，2 出现了 2 次，3 只出现了 1 次。没有两个数的出现次数相同。
// 示例 2：

// 输入：arr = [1,2]
// 输出：false
// 示例 3：

// 输入：arr = [-3,0,1,-3,1,1,1,-3,10,0]
// 输出：true

// 自己的答案：
/**
 * @param {number[]} arr
 * @return {boolean}
 */
var uniqueOccurrences = function(arr) {ffff
    let obj = {}
    for(let i = 0; i < arr.length; i++) {
        if(obj[arr[i]] === undefined) {
            obj[arr[i]] = 1
        } else {
            obj[arr[i]] += 1
        }
    }
    return Object.values(obj).length === new Set(Object.values(obj)).size
};

console.log(uniqueOccurrences([1,2,2,1,1,3]))

// Gpt答案
function uniqueOccurrences(arr) {
    // 用于记录每个数字的出现次数
    const countMap = {};
    
    // 统计每个数字的出现次数
    for (const num of arr) {
        if (countMap[num]) {
            countMap[num]++;
        } else {
            countMap[num] = 1;
        }
    }
    
    // 使用Set来确保所有次数是唯一的
    const uniqueCounts = new Set(Object.values(countMap));
    
    // 检查countMap中的值数量是否与uniqueCounts中的数量相同
    return uniqueCounts.size === Object.keys(countMap).length;
}

// 示例测试
console.log(uniqueOccurrences([1,2,2,1,1,3])); // 输出: true
console.log(uniqueOccurrences([1,2])); // 输出: false
console.log(uniqueOccurrences([-3,0,1,-3,1,1,1,-3,10,0])); // 输出: true

// 官方答案：
var uniqueOccurrences = function(arr) {
    const occur = new Map();
    for (const x of arr) {
        if (occur.has(x)) {
            occur.set(x, occur.get(x) + 1);
        } else {
            occur.set(x, 1);
        }
    }
    const times = new Set();
    for (const [key, value] of occur) {
        times.add(value);
    }
    return times.size === occur.size;
};

var uniqueOccurrences = function(arr, a) {
    return a = arr.reduce((h, v) => h.set(v, (h.get(v) || 0) + 1), new Map()), new Set(a.values()).size === a.size
};